/**
 * @(#)EmpleadoK.java Jan 15, 2007
 *
 * Copyright (c) 2005-2010 Psiqueware S.A. de C.V. All Rights Reserved.
 * This software is the proprietary information Psiqueware S.A. de C.V.
 * Use is subject to license terms.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
 * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 *
 * <br/>Usuario : Psique
 * <br/>Creaci&oacute;n: Jan 15, 2007 - 9:22:07 AM
 * <br/>
 * <br/>
 * <br/><t5>Cambios :</t5>
 * <br/><b>Fecha | Autor  |  Cambios</b>
 * <ul>
 * <li>Jan 15, 2007 | <a href = "mailto:AngelElectrico@PsiqueWare.com">Psique</a> | Creaci&oacute;n del Objeto.</li>
 * <li>Enero 16, 2007 | <a href = "mailto:AngelElectrico@PsiqueWare.com">Psique</a> | Se renombra la clase por empleo y se le a&ntilde;ade un cargo.</li>
 * <li>Enero 24, 2007 | <a href = "mailto:AngelElectrico@PsiqueWare.com">Psique</a> | Se quitar&oacute;n algunas caracter&iacute;sticas que eran mas propias de un {@link Contrato} que de un {@link Empleado}.</li>
 * <li>Abr 19, 2007 | <a href = "mailto:AngelElectrico@PsiqueWare.com">Psique</a> | Se eliminar&oacute;n las referencias a las clases Empresa, Deportamento, etc y se cambiar&oacute;n por referencias a Estructura.</li>
 * </ul>
 */

package com.psiqueware.jazmin.empresas.recursos.humanos.modelo;

import com.psiqueware.alheli.basico.BaseObject;
import com.psiqueware.jazmin.empresas.recursos.humanos.Contrato;
import com.psiqueware.jazmin.empresas.recursos.humanos.EstatusLaboral;
import com.psiqueware.jazmin.empresas.recursos.humanos.Empleado;
import com.psiqueware.tulipan.cargos.Cargo;
import com.psiqueware.tulipan.cargos.Responsabilidad;
import com.psiqueware.tulipan.personas.PersonaFisica;
import com.psiqueware.tulipan.organizacional.Estructura;

import java.util.List;

/**
 * Modo en el como una {@link PersonaFisica} presta servicios remunerados a una Empresa.
 * <br/>Paquete Original: com.psiqueware.tulipan.empresas.modelo
 * <br/>Nombre  Original: Empleado
 * <br/>Oprima para ver : <a href="EmpleadoK.java.html"><i>C&oacute;digo Fuente</i> </a>
 *
 * @author <a href="mailto:AngelElectrico@PsiqueWare.com">Psique</a>
 * @version Revision: 1.1 Jan 15, 2007 9:22:07 AM
 * @noinspection ClassNamingConvention,ClassWithoutLogger
 */
public class EmpleadoK extends BaseObject implements Empleado
{

    /** {@link PersonaFisica} que constituye este {@link Empleado}. */
    private PersonaFisica m_trabajador;

    /**
     * Posici&oacute;n que ocupa este {@link Empleado} con relaci&oacute;n a otros en una
     * estructura jer&aacute;rquica. Es decir quien es jefe de quien lo determina el
     * {@link Cargo}; adem&aacute;s contiene las {@link Responsabilidad}es que
     * desempe&ntilde;a la {@link PersonaFisica} que tiene este {@link Empleado}.
     */
    private Cargo m_cargo;

    /** {@link EstatusLaboral} de este {@link Empleado}. */
    private EstatusLaboral m_estatusLaboral;

    /** Acuerdo entre la Empresa y el trabajador sobre las condiciones en la que este prestar&aacute; el servicio. */
    private Contrato m_contrato;

    /**
     * Clave del {@link Empleado}.
     */
    private String m_clave;


    /**
     * Identificador de la {@link Estructura} a donde esta asignado el {@link Empleado}.
     */
    private Long m_idEstructura;

    /** Constructor de EmpleadoK. */
    public EmpleadoK ()
    {

    }

    /**
     * Constructor con par&aacute;metros.
     *
     * @param empleado       {@link PersonaFisica} que tiene este {@link Empleado}.
     * @param estatusLaboral {@link EstatusLaboral} de este {@link Empleado}.
     * @param contrato       Acuerdo entre la Empresa y el trabajador.
     */
    public EmpleadoK ( final PersonaFisica empleado, final Contrato contrato, final EstatusLaboral estatusLaboral, final Estructura estructura)
    {
        m_trabajador = empleado;
        m_estatusLaboral = estatusLaboral;
        m_contrato = contrato;
    m_idEstructura=estructura.getId ();
    }

    /**
     * Devuelve el promedio de las calificaciones asignadas al cumplimiento de cada {@link Responsabilidad} que tenga el
     * {@link Empleado}.
     *
     * @return
     */
    public double evaluarDesempeno ()
    {
        double desempeno = 0;
        final List<Responsabilidad> responsabilidades = getCargo ().listResponsabilidades ();
        for ( Responsabilidad responsabilidad : responsabilidades )
        {
            desempeno += responsabilidad.getCalificacion ();
        }
        desempeno /= responsabilidades.size ();
        return desempeno;
    }

    /**
     * Devuelve la {@link PersonaFisica} que constituye este {@link Empleado}.
     *
     * @return valor de 'personaFisica'.
     *
     * @see PersonaFisica
     */
    public PersonaFisica getTrabajador ()
    {
        return m_trabajador;
    }

    /**
     * Establece la {@link PersonaFisica} que constituye este {@link Empleado}.
     *
     * @param trabajador nuevo valor para 'personaFisica'.
     *
     * @see PersonaFisica
     */
    public void setTrabajador ( final PersonaFisica trabajador )
    {
        m_trabajador = trabajador;
    }


    /**
     * Devuelve el Posici&oacute;n que ocupa este {@link Empleado} con relaci&oacute;n a otros en una
     * estructura jer&aacute;rquica. Es decir quien es jefe de quien lo determina el
     * {@link Cargo}; adem&aacute;s contiene las {@link Responsabilidad}es que
     * desempe&ntilde;a la {@link PersonaFisica} que tiene este {@link Empleado}.
     *
     * @return valor de 'cargo'.
     *
     * @see Cargo
     */
    public Cargo getCargo ()
    {
        return m_cargo;
    }

    /**
     * Establece el Posici&oacute;n que ocupa este {@link Empleado} con relaci&oacute;n a otros en una
     * estructura jer&aacute;rquica. Es decir quien es jefe de quien lo determina el
     * {@link Cargo}; adem&aacute;s contiene las {@link Responsabilidad}es que
     * desempe&ntilde;a la {@link PersonaFisica} que tiene este {@link Empleado}.
     *
     * @param cargo nuevo valor para 'cargo'.
     *
     * @see Cargo
     */
    public void setCargo ( final Cargo cargo )
    {
        m_cargo = cargo;
    }


    /**
     * Devuelve el {@link EstatusLaboral} de este {@link Empleado}.
     *
     * @return valor de 'estatusLaboral'.
     *
     * @see EstatusLaboral
     */
    public EstatusLaboral getEstatusLaboral ()
    {
        return m_estatusLaboral;
    }

    /**
     * Establece el {@link EstatusLaboral} de este {@link Empleado}.
     *
     * @param estatusLaboral nuevo valor para 'estatusLaboral'.
     *
     * @see EstatusLaboral
     */
    public void setEstatusLaboral ( final EstatusLaboral estatusLaboral )
    {
        m_estatusLaboral = estatusLaboral;
    }

    /**
     * Devuelve el Acuerdo entre la Empresa y el trabajador sobre las condiciones en la que este prestar&aacute; el servicio.
     *
     * @return valor de 'contrato'.
     *
     * @see Contrato
     */
    public Contrato getContrato ()
    {
        return m_contrato;
    }

    /**
     * Establece el Acuerdo entre la Empresa y el trabajador sobre las condiciones en la que este prestar&aacute; el servicio.
     *
     * @param contrato nuevo valor para 'contrato'.
     *
     * @see Contrato
     */
    public void setContrato ( final Contrato contrato )
    {
        m_contrato = contrato;
    }

     /**
     * Devuelve el Clave del {@link Empleado}.
     * @return valor de 'clave'.
     * @see String
     */
    public String getClave ()
    {
        return m_clave;
    }

    /**
     * Establece el Clave del {@link Empleado}.
     * @param clave nuevo valor para 'clave'.
     * @see String
     */
    public void setClave ( final String clave )
    {
        m_clave = clave;
    }


    /**
     * Devuelve el Identificador de la {@link Estructura} a donde esta asignado el {@link Empleado}.
     * @return valor de 'idEstructura'.
     * @see Long
     */
    public Long getIdEstructura ()
    {
        return m_idEstructura;
    }

    /**
     * Establece el Identificador de la {@link Estructura} a donde esta asignado el {@link Empleado}.
     * @param idEstructura nuevo valor para 'idEstructura'.
     * @see Long
     */
    public void setIdEstructura ( final Long idEstructura )
    {
        m_idEstructura = idEstructura;
    }

    /**
     * Convierte este {@link Empleado} a su representación textual.
     *
     * @noinspection DuplicateStringLiteralInspection,HardCodedStringLiteral,HardcodedLineSeparator
     */
    public String toString ()
    {
        StringBuilder sb = new StringBuilder ();
        sb.append ( "<Instance Class = '" ).append ( this.getClass ().getCanonicalName () ).append ( "'>" );
        sb.append ( "<Super Class = '" ).append ( "com.psiqueware.alheli.alheli.BaseObject" ).append ( "'>" ).append ( super.toString () ).append ( "</Super>" );
        sb.append ( "<trabajador>" ).append ( m_trabajador ).append ( "</trabajador> " );
        sb.append ( "<cargo>" ).append ( m_cargo ).append ( "</cargo> " );
        sb.append ( "<estatusLaboral>" ).append ( m_estatusLaboral ).append ( "</estatusLaboral> " );
        sb.append ( "<contrato>" ).append ( m_contrato ).append ( "</contrato> " );
        sb.append ( "<clave>" ).append ( m_clave ).append ( "</clave> " );
        sb.append ( "<idEstructura>" ).append ( m_idEstructura ).append ( "</idEstructura> " );
        sb.append ( "</Instance>" );
        return sb.toString ();
    }
}

